using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using twistmachinev2.OPCUA;
using twistmachinev2.CommonUse;
using twistmachinev2.Business;
using log4net.Config;

namespace twistmachinev2
{
    internal static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            // 初始化Log4Net
            InitializeLogging();
            
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            DevExpress.LookAndFeel.UserLookAndFeel.Default.SetSkinStyle("Office 2019 Colorful");
            
            // 应用程序启动
            
            // 设置全局异常处理
            SetupGlobalExceptionHandling();
            
            // 显示登录界面
            using (var loginForm = new FrmLogin())
            {
                if (loginForm.ShowDialog() == DialogResult.OK)
                {
                    // 登录成功，记录登录信息
                    // 用户成功登录系统
                    
                    // 初始化OPCUA服务
                    InitializeOpcUaService();
                    
                    // 启动主界面
                    Application.Run(new FrmMain3D());
                    
                    // 应用程序退出时清理资源
                    CleanupOpcUaService();
                    
                    // 清除用户登录信息
                    BaseData.ClearUserInfo();
                    // 用户已退出系统
                }
                else
                {
                    // 用户取消登录或登录失败
                    // 用户取消登录，应用程序退出
                }
            }
            
            // 应用程序退出
        }
        
        /// <summary>
        /// 初始化Log4Net日志系统
        /// </summary>
        private static void InitializeLogging()
        {
            try
            {
                // 配置Log4Net
                var configFile = new System.IO.FileInfo("log4net.config");
                if (configFile.Exists)
                {
                    XmlConfigurator.Configure(configFile);
                }
                else
                {
                    // 如果配置文件不存在，使用基本配置
                    BasicConfigurator.Configure();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"日志系统初始化失败：{ex.Message}", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
        
        /// <summary>
        /// 设置全局异常处理
        /// </summary>
        private static void SetupGlobalExceptionHandling()
        {
            // 设置应用程序域未处理异常事件
            AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
            {
                var ex = e.ExceptionObject as Exception;
                LogManager.LogError($"应用程序域未处理异常: {ex?.Message}", ex);
            };
            
            // 设置UI线程未处理异常事件
            Application.ThreadException += (sender, e) =>
            {
                LogManager.LogError($"UI线程未处理异常: {e.Exception.Message}", e.Exception);
            };
        }
        
        /// <summary>
        /// 初始化OPCUA服务
        /// </summary>
        private static async void InitializeOpcUaService()
        {
            try
            {
                // 开始初始化OPC UA服务
                var serviceManager = OpcUaServiceManager.Instance;
                var result = await serviceManager.InitializeAsync();
                
                if (!result.IsSuccess)
                {
                    // OPC UA服务初始化失败
                    MessageBox.Show($"OPCUA服务初始化失败：{result.Message}\n\n应用程序将继续运行，但OPCUA功能可能不可用。", 
                                  "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else
                {
                    // OPC UA服务初始化成功
                }
            }
            catch (Exception ex)
            {
                LogManager.LogError($"OPC UA服务初始化异常：{ex.Message}", ex);
                MessageBox.Show($"OPCUA服务初始化异常：{ex.Message}\n\n应用程序将继续运行，但OPCUA功能可能不可用。", 
                              "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        
        /// <summary>
        /// 清理OPCUA服务资源
        /// </summary>
        private static void CleanupOpcUaService()
        {
            try
            {
                // 开始清理OPC UA服务资源
                var serviceManager = OpcUaServiceManager.Instance;
                serviceManager?.Dispose();
                // OPC UA服务资源清理完成
            }
            catch (Exception ex)
            {
                LogManager.LogError($"清理OPC UA服务资源时发生异常：{ex.Message}", ex);
                System.Diagnostics.Debug.WriteLine($"清理OPCUA服务资源时发生异常：{ex.Message}");
            }
        }
    }
}
